package com.company;

import java.io.*;
import java.lang.Integer;
import java.lang.Float;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

public class EvalVistor extends CalcBaseVisitor < BigDecimal> {
    Map<String, BigDecimal > memory = new HashMap<String,BigDecimal>();

    @Override
    public BigDecimal visitAssignment(CalcParser.AssignmentContext ctx) {
        String var = ctx.VAR().getText();
        BigDecimal value = visit(ctx.expr());
        memory.put(var, value);

        return value;
    }

    @Override
    public BigDecimal visitPrintExpr(CalcParser.PrintExprContext ctx) {
        BigDecimal value = visit(ctx.expr(0));
        System.out.println(value);
        return BigDecimal.valueOf(0);
    }

    @Override
    public BigDecimal visitNumber(CalcParser.NumberContext ctx) {
        return BigDecimal.valueOf( Float.valueOf(ctx.NUMBER().getText()));
    }

    @Override
    public BigDecimal visitMulDiv(CalcParser.MulDivContext ctx) {
        BigDecimal left = visit(ctx.expr(0));
        BigDecimal right = visit(ctx.expr(1));

        if(ctx.op.getType() == CalcParser.DIV){
            if (right.floatValue()!=0)
                return left.divide(right,3);

            System.out.println("Error, divide zero");
        }
        return left.multiply(right);
    }

    @Override
    public BigDecimal visitAddSub(CalcParser.AddSubContext ctx) {
        BigDecimal left = visit(ctx.expr(0));
        BigDecimal right = visit(ctx.expr(1));

        if(ctx.op.getType() == CalcParser.PLUS){
            return BigDecimal.valueOf(left.floatValue()+right.floatValue());
        }
        return  BigDecimal.valueOf(left.floatValue()-right.floatValue());
    }

    @Override
    public BigDecimal visitParens(CalcParser.ParensContext ctx) {

        return visit(ctx.expr());
    }

    @Override
    public BigDecimal visitVaraible (CalcParser.VaraibleContext ctx) {
        String id = ctx.VAR().getText();
        if (memory.containsKey(id))
            return memory.get(id);

        System.out.println("The variable "+ id + " should be declared before use");
        return BigDecimal.valueOf(0);
    }
}
